// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import {userLogin} from '@/api/userApi';
import {adminEdit, adminSetAvatar, adminSetNickName, adminUserLogin} from '@/api/adminUserApi';

Vue.use(Vuex);
const adminModule = {
    namespaced: true,
    state: {
        token: null, //存储登陆凭证
        adminUser: null, //表示超级管理员登陆状态
        loading: false, // 用于显示加载状态
        error: null // 用于存储错误信息
    },
    mutations: {
        /**
         * 超级管理员相关
         * @param {*} state
         * @param {*} data
         */
        SAVE_ADMIN_USER(state, data) {
            state.adminUser = data;
            sessionStorage.setItem('admin_user', JSON.stringify(data))
        },
        LOAD_ADMIN_USER(state) {
            const storeData = sessionStorage.getItem('admin_user')
            if (storeData) {
                state.adminUser = JSON.parse(storeData);
            }
        },
        // 设置加载状态
        SET_LOADING(state, status) {
            state.loading = status;
        },
        // 设置错误信息
        SET_ERROR(state, error) {
            state.error = error;
        },
        // 设置登陆凭证
        SET_TOKEN(state, token) {
            state.token = token;
            sessionStorage.setItem("jwtToken", token)
        },
        // 加载登陆凭证
        LOAD_TOKEN(state) {
            state.token = sessionStorage.getItem("jwtToken");
        },
        REMOVE_TOKEN(state) {
            state.token = null;
            sessionStorage.removeItem("jwtToken")
        }
    },
    actions: {
        /**
         * 登录
         * @param {*} param0
         * @param {*} params
         * @returns
         */
        ADMIN_USER_LOGIN({commit}, params) {
            commit('SET_LOADING', true);
            commit('SET_ERROR', null);
            return adminUserLogin(params)
                .then(res => {
                    commit('SAVE_ADMIN_USER', res.data)
                    return res;
                }).catch(err => {
                    commit('SET_ERROR', err.message);
                    return Promise.reject(err);
                }).finally(() => {
                    commit('SET_LOADING', false);
                })
        },
        /**
         * 修改昵称
         * @param {*} param0
         * @param {*} params
         * @returns
         */
        ADMIN_SET_NICK_NAME({commit, state}, params) {
            commit('SET_LOADING', true);
            commit('SET_ERROR', null);
            return adminSetNickName(params)
                .then(res => {
                    // 只更新 nickname 属性
                    const updatedUser = {
                        ...state.adminUser,  // 保留原有属性
                        nickname: res.data.nickname  // 只更新昵称
                    };
                    commit('SAVE_ADMIN_USER', updatedUser)
                    return res;
                })
                .catch(err => {
                    commit("SET_ERROR", err.message)
                    return Promise.reject(err)
                })
                .finally(() => {
                    commit("SET_LOADING", false)
                })
        },
        /**
         * 修改头像
         * @param {*} param0
         * @param {*} params
         * @returns
         */
        ADMIN_SET_AVATAR({commit, state}, params) {
            commit('SET_LOADING', true);
            commit('SET_ERROR', null);
            return adminSetAvatar(params)
                .then(res => {
                    // 只更新 avatarUrl 属性
                    const updatedUser = {
                        ...state.adminUser,  // 保留原有属性
                        avatarUrl: res.data.avatarUrl
                    };
                    commit('SAVE_ADMIN_USER', updatedUser)
                    return res;
                })
                .catch(err => {
                    commit("SET_ERROR", err.message)
                    return Promise.reject(err)
                })
                .finally(() => {
                    commit("SET_LOADING", false)
                })
        },
        /**
         * 修改密码
         * @param {*} param0
         * @param {*} params
         * @returns
         */
        ADMIN_SET_PASSWORD({commit, state}, params) {
            commit('SET_LOADING', true);
            commit('SET_ERROR', null);
            return adminSetAvatar(params)
                .then(res => {
                    // 只更新 avatarUrl 属性
                    const updatedUser = {
                        ...state.adminUser,  // 保留原有属性
                        password: res.data.password
                    };
                    commit('SAVE_ADMIN_USER', updatedUser)
                    return res;
                })
                .catch(err => {
                    commit("SET_ERROR", err.message)
                    return Promise.reject(err)
                })
                .finally(() => {
                    commit("SET_LOADING", false)
                })
        },
        /**
         * 超级管理员编辑
         * @param {*} param0
         * @param {*} params
         * @param {*} manageId
         */
        SUPER_ADMIN_EDIT({commit, state}, params) {
            commit('SET_LOADING', true);
            commit('SET_ERROR', null);
            return adminEdit(params)
                .then(res => {
                    // 表示操作人和被操作人是同一个
                    if (params.adminId === params.manageId) {
                        const updatedUser = {
                            ...state.adminUser,
                            username: params.username,
                            password: params.password,
                            nickname: params.nickname,
                            roleId: params.roleId
                        }
                        commit('SAVE_ADMIN_USER', updatedUser)
                    }
                    return res;
                })
                .catch(err => {
                    commit("SET_ERROR", err.message)
                    return Promise.reject(err)
                })
                .finally(() => {
                    commit("SET_LOADING", false)
                })
        }
    },
    getters: {
        getAdmin: state => state.adminUser,
        getToken: state => state.token
    }
}

const userModule = {
    namespaced: true,
    state: {
        token: null,
        user: null,
        product: null, // 表示普通用户点击存储的商品信息
        loading: false, // 用于显示加载状态
        error: null // 用于存储错误信息
    },
    mutations: {
        // 保存用户数据
        SAVE_USER(state, user) {
            state.user = user;
            sessionStorage.setItem('user', JSON.stringify(user));
        },
        // 加载用户数据
        LOAD_USER(state) {
            const storeData = sessionStorage.getItem('user');
            if (storeData) {
                state.user = JSON.parse(storeData);
            }
        },
        // 移除用户数据
        REMOVE_USER(state) {
            state.user = null;
        },
        // 保存商品数据
        SAVE_PRODUCT(state, data) {
            state.product = data;
            sessionStorage.setItem('product', JSON.stringify(data));
        },
        // 加载商品数据
        LOAD_PRODUCT(state) {
            const storeData = sessionStorage.getItem('product');
            if (storeData) {
                state.product = JSON.parse(storeData);
            }
        },
        // 设置加载状态
        SET_LOADING(state, status) {
            state.loading = status;
        },
        // 设置错误信息
        SET_ERROR(state, error) {
            state.error = error;
        },
        // 设置登陆凭证
        SET_TOKEN(state, token) {
            state.token = token;
            sessionStorage.setItem("jwtToken", token)
        },
        // 加载登陆凭证
        LOAD_TOKEN(state) {
            state.token = sessionStorage.getItem("jwtToken");
        },
        REMOVE_TOKEN(state) {
            state.token = null;
            sessionStorage.removeItem("jwtToken")
        }
    },
    actions: {
        // 用户登录
        USER_LOGIN({commit}, params) {
            commit('SET_LOADING', true); // 表示开始加载数据
            commit('SET_ERROR', null); // 清空错误信息
            return userLogin(params) // 直接返回Promise链
                .then(res => {
                    commit('SAVE_USER', res.data);
                    return res; // 传递结果
                })
                .catch(err => {
                    // 可以选择是否移除用户状态
                    commit('SET_ERROR', err.message);
                    return Promise.reject(err); // 继续抛出
                })
                .finally(() => {
                    commit('SET_LOADING', false);
                });
        },
        // 加载用户数据
        LOAD_USER_DATA({commit}) {
            commit('LOAD_USER');
        },
        // 加载商品数据
        LOAD_PRODUCT_DATA({commit}) {
            commit('LOAD_PRODUCT');
        }
    },
    getters: {
        getProduct: state => state.product,
        getUser: state => state.user,
        getToken: state => state.token
    }
};
export default new Vuex.Store({
    modules: {
        user: userModule, // 普通用户模块
        admin: adminModule // 超级管理员模块
    }
});
